/**
 * 任务实现
 *
 * 创建时间：2021年8月5日
 * 作者：李述铜
 * 联系邮箱: 527676163@qq.com
 */
#ifndef TASK_H
#define TASK_H
#define TASK_NAME_SIZE			32
#define TASK_TIME_SLICE_DEFAULT		10			// 时间片计数

#include "comm/types.h"
#include "cpu/cpu.h"
#include "tools/list.h"

/**
 * @brief 任务控制块结构
 */
typedef struct _task_t {
	// uint32_t* stack; 
	enum {
		TASK_CREATED,
		TASK_RUNNING,
		TASK_SLEEP,
		TASK_READY,
		TASK_WAITING,
	}state;
	char name[TASK_NAME_SIZE];
    int sleep_ticks;		// 睡眠时间
    int time_slice;			// 时间片
	int slice_ticks;		// 递减时间片计数
	tss_t tss;				// 任务的TSS段
	uint16_t tss_sel;		// tss选择子
	list_node_t wait_node;
	list_node_t run_node;
	list_node_t all_node;
}task_t;

typedef struct _task_manager_t
{
	task_t* curr_task;
	task_t idle_task;
	list_t list_node_all;
	list_t list_node_run;
	list_t list_node_sleep;
	task_t first_task;
}task_manager_t;


int task_init (task_t *task, const char * name, uint32_t entry, uint32_t esp);
void task_switch_from_to (task_t * from, task_t * to);
void task_set_ready(task_t *task);
void task_set_block (task_t *task);
void task_set_sleep(task_t *task, uint32_t ticks);
void task_set_wakeup (task_t *task);
int sys_yield (void);
/**
 * @brief 从就绪队列中找到下一个运行的任务并进行运行，并且相应的改变任务管理系统中
 * 的curr_task参数
 * 
 */
void sys_msleep(uint32_t ticks);
void task_dispatch (void);
task_t * task_current (void);
void task_switch_from_to (task_t * from, task_t * to);
void task_manager_init (void);
void task_first_init (void);
task_t * task_first_task (void);
void task_time_tick();
#endif

